#include <iostream>
#include <string>

using namespace std;

template<class NameType, class AgeType>
class Person;

template<typename NameType, typename AgeType>
void printPerson2(Person<NameType, AgeType> p)
{
    cout << "类外实现-->" << " 姓名：" << p.m_Name << " 年龄：" << p.m_Age << endl;
}


template<class NameType, class AgeType>
class Person
{
    // 全局函数类内实现
    friend void printPerson(Person<NameType, AgeType> p)
    {
        cout << "姓名：" << p.m_Name << " 年龄：" << p.m_Age << endl;
    }

    // 全局函数类外实现
    // 加空模板的参数列表
    // 如果全局函数 是类外实现,需要让编译器提前知道这个函数的存在
    friend void printPerson2<>(Person<NameType, AgeType> p);
public:


    Person(NameType name, AgeType age)
    {
        this->m_Name = name;
        this->m_Age  = age;
    }
private:
    NameType m_Name;
    AgeType  m_Age;
};



// 1、全局函数在类内实现
void test01()
{
    Person<string, int> p("tom", 20);
    printPerson(p);
    
}

// 全局函数在类外实现的测试
void test02()
{
    Person<string, int> p2("八戒", 20);
    printPerson2(p2);
}

int main()
{
    test01();
    test02();
    return 0;
}